# 1. 添加cmake版本说明
cmake_minimum_required(VERSION 3.1.3)
# 2. 声明工程名称
project(odb-test)

# 3. 检测并生成ODB框架代码
#   1. 添加所需的odb映射代码文件名称 -- 即.hxx生成ODB的框架代码
# CMAKE_CURRENT_SOURCE_DIR cmakelist文件的所在的目录
set(odb_path ${CMAKE_CURRENT_SOURCE_DIR}/entity)    #.hxx文件在哪个目录     可以理解为odb_path为指针, ${}为解引用
set(odb_files student.hxx)  # 将这个变量设置到odb_files, 假如有多个.hxx文件 此时这个变量就可以理解为数组/列表

#   2. 检测框架代码文件是否已经生成
set(odb_hxx "")     # 代表框架代码生成后以.odb.hxx结尾的文件
set(odb_cxx "")     # 代表框架代码生成后以.odb.cxx结尾的文件
set(odb_srcs "")    # odb源码文件

foreach(odb_file ${odb_files}) # 类似于for循环
    string(REPLACE ".hxx" "-odb.hxx" odb_hxx ${odb_file})   #将odb_file变量里的.hxx替换为-odb.hxx, 并保存到odb_hxx变量里面
    string(REPLACE ".hxx" "-odb.cxx" odb_cxx ${odb_file})
    # CMAKE_CURRENT_BINARY_DIR cmake的工作目录(生成文件的目录) - 默认当前目录
#   3. 如果没有生成, 则预定义生成指令 -- 用于在构建项目之前生成的框架代码 student.hxx -> student.odb.hxx student.odb.cxx student.odb.ixx student.sql
    if (NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/${odb_hxx})  # 如果不存在${odb_hxx}这个文件名  如果不存在才会去编译, 这样编译效率就大大提高了, 好处
        add_custom_command(     # 执行外部指令
            PRE_BUILD # 表示在所有其他步骤之前执行自定义命令
            COMMAND odb # 要执行的指令名称
            ARGS -d mysql --std c++11 --generate-query --generate-schema --profile boost/date-time ${odb_path}/${odb_file} # 要执行的指令运行参数选项
            DEPENDS ${odb_path}/${odb_file} # 指定命令的依赖项
            OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx} # 指定要生成的目标名称
            COMMENT "生成ODB框架代码文件: " ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx} # 执行命令时要打印的内容
        )
    endif() #if的结尾标志
#   4. 将所有生成的框架源码文件名称保存起来
    list(APPEND odb_srcs ${CMAKE_CURRENT_BINARY_DIR}/${odb_cxx})    # 此时odb_srcs 就类似于数组/列表
endforeach() # for循环的结束标志

# 4. 获取源码目录下的所有源码文件 -- 将source下的源码文件全部提取出来 .cc .c .hpp .cxx...等等
set(src_files "")
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/source src_files)  #查找源码文件, 将源码都放到src_files变量里
# 5. 声明目标及依赖
add_executable(main ${src_files} ${odb_srcs})
# 6. 设置头文件默认搜索路径 -- 我们不想使用头文件的包含 用多级目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/entity)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# 7. 设置需要连接的库
target_link_libraries(main -lodb-mysql -lodb -lodb-boost -lgflags)
# 8. 设置安装路径
INSTALL(TARGETS main RUNTIME DESTINATION bin)